package cn.huiyunche.base.service.interfaces;

import cn.huiyunche.base.service.model.SOrder;
import cn.huiyunche.base.service.model.SServiceOrder;
import cn.huiyunche.base.service.model.SServiceOrderExample;
import cn.huiyunche.base.service.model.SServiceOrderVehicle;
import cn.huiyunche.base.service.vo.PageVo;
import cn.huiyunche.base.service.vo.SServiceOrderAdminVo;
import cn.huiyunche.base.service.vo.SServiceOrderVo;
import cn.huiyunche.tools.basic.exceptions.BusinessException;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 服务订单接口类
 *
 * @author Administrator
 */
public interface SServiceOrderService {

    /**
     * @param sServiceOrder 服务订单model
     * @return
     * @Title: add
     * @Description: 保存服务订单
     * @return: long 保存后的id
     */
    long add(SServiceOrder sServiceOrder);

    /**
     * @param sOrder
     * @Title: update
     * @Description: 更新
     * @return: void
     */
    void update(SServiceOrder sOrder);

    /**
     * @param customerOrderId 客户订单id
     * @Title: cancel
     * @Description: 根据客户订单id取消服务订单
     * @return: void
     */
    void cancel(long customerOrderId) throws Exception;

    /**
     * 查询服务订单详细信息
     *
     * @param id
     * @return
     */
    SServiceOrderAdminVo getSServiceOrderAdminVoById(Long id);

    /**
     * 查询服务订单列表
     *
     * @param page
     * @param sServiceOrderVo
     * @return
     */
    Map<String, Object> list(PageVo page, SServiceOrderAdminVo sServiceOrderVo);

    /**
     * 修改服务订单状态
     *
     * @param ids
     * @param status
     * @return
     * @throws Exception
     */
    int updateServiceStatus(String ids, String status) throws Exception;

    /**
     * 根据主键ID 查询服务订单
     *
     * @param valueOf
     * @return
     */
    SServiceOrder selectById(Long valueOf);

    /**
     * 查询 服务订单
     *
     * @param example
     * @return
     */
    List<SServiceOrder> selectByExample(SServiceOrderExample example);

    /**
     * 服务订单调度次数 ＋1
     * -- 没用
     *
     * @param id
     * @return
     */
    int addDispatchTimes(Long id);

    /**
     * @param customerOrderId 客户订单id
     * @param status          服务订单状态
     * @return
     * @Title: getListByCOrderId
     * @Description: 根据客户订单id和状态查询所有服务订单
     * @return: List<SServiceOrderVo>
     */
    List<SServiceOrderVo> getListByCOrderId(long customerOrderId, List<Integer> status);

    /**
     * @param sOrder        客户订单
     * @param sServiceOrder 客户订单id
     * @param vehicle       车辆信息
     * @param isPick        是否上门提车
     * @param isDeliv       是否送车上门
     * @param hasInvoice    是否有发票 (是否计算发票税费)
     * @Title: computeFees
     * @Description: 计算客户订单各种费用的总计
     * @return: BigDecimal
     */
    BigDecimal computeFees(SOrder sOrder, SServiceOrder sServiceOrder, SServiceOrderVehicle vehicle, Boolean isPick, Boolean isDeliv, Boolean hasInvoice);

    /**
     * @param customerOrderId 客户服务订单主键
     * @param status          服务订单状态
     * @Title: assertStatus
     * @Description: 判断客户订单的服务订单状态
     * @return: boolean
     */
    boolean assertStatus(Long customerOrderId, Integer status);

    /**
     * @param customerOrderId 客户订单主键
     * @param status          服务订单状态
     * @Title: updateStatusByCOrder
     * @Description: 根据客户订单主键更新服务订单状态
     * @return: void
     */
    void updateStatusByCOrder(Long customerOrderId, Integer status) throws Exception;

    /**
     * @param customerOrderId 客户订单主键
     * @Title: serviceOrderIsNotDispatch
     * @Description: 判断客户订单下 所有的服务订单是否被调度过 －在客户订单取消的时候用
     * @return: bolean
     */
    boolean serviceOrderIsNotDispatch(Long customerOrderId);

    /**
     * Delete. 删除客户服务订单
     *
     * @param customerOrderId the customer order id
     */
    int delete(Long customerOrderId);

    /**
     * 新订单语音提示
     *
     * @param date
     * @return
     * @throws BusinessException
     */
    int selectAfterByParams(Date date) throws Exception;
}
